const EventEmitter = require("./template.js")

function testPubSubPattern() {
  console.log("=== 发布订阅模式测试 ===")

  console.log(
    "1. 基本订阅和发布功能:",
    (() => {
      const emitter = new EventEmitter()
      let result = ""

      emitter.on("test", (msg) => {
        result = msg
      })

      emitter.emit("test", "hello world")
      return result === "hello world"
    })()
  )

  console.log(
    "2. 多个监听器:",
    (() => {
      const emitter = new EventEmitter()
      const results = []

      emitter.on("multi", (msg) => results.push(`A: ${msg}`))
      emitter.on("multi", (msg) => results.push(`B: ${msg}`))

      emitter.emit("multi", "test")

      return (
        results.length === 2 &&
        results[0] === "A: test" &&
        results[1] === "B: test"
      )
    })()
  )

  console.log(
    "3. 取消订阅功能:",
    (() => {
      const emitter = new EventEmitter()
      let count = 0

      const callback1 = () => count++
      const callback2 = () => count++

      emitter.on("off", callback1)
      emitter.on("off", callback2)
      emitter.off("off", callback1)

      emitter.emit("off")
      return count === 1
    })()
  )

  console.log(
    "4. 一次性订阅功能:",
    (() => {
      const emitter = new EventEmitter()
      let count = 0

      emitter.once("once", () => count++)

      emitter.emit("once")
      emitter.emit("once") // 第二次不应该执行

      return count === 1
    })()
  )

  console.log(
    "5. 多参数传递:",
    (() => {
      const emitter = new EventEmitter()
      let result = null

      emitter.on("args", (a, b, c) => {
        result = [a, b, c]
      })

      emitter.emit("args", 1, 2, 3)
      return result && result[0] === 1 && result[1] === 2 && result[2] === 3
    })()
  )

  console.log(
    "6. 获取事件名称:",
    (() => {
      const emitter = new EventEmitter()

      emitter.on("event1", () => {})
      emitter.on("event2", () => {})
      emitter.on("event3", () => {})

      const eventNames = emitter.eventNames()
      return (
        eventNames.length === 3 &&
        eventNames.includes("event1") &&
        eventNames.includes("event2") &&
        eventNames.includes("event3")
      )
    })()
  )

  console.log(
    "7. 获取监听器数量:",
    (() => {
      const emitter = new EventEmitter()

      emitter.on("count", () => {})
      emitter.on("count", () => {})
      emitter.on("count", () => {})

      return emitter.listenerCount("count") === 3
    })()
  )

  console.log(
    "8. 链式调用:",
    (() => {
      const emitter = new EventEmitter()
      let result = ""

      emitter
        .on("chain", (msg) => (result += `A:${msg}`))
        .on("chain", (msg) => (result += `B:${msg}`))
        .emit("chain", "test")

      return result === "A:testB:test"
    })()
  )

  console.log(
    "9. 错误处理:",
    (() => {
      const emitter = new EventEmitter()
      let errorCaught = false

      emitter.on("error", () => {
        throw new Error("test error")
      })

      try {
        emitter.emit("error")
      } catch (e) {
        errorCaught = true
      }

      return errorCaught
    })()
  )

  console.log(
    "10. 复杂场景 - 事件总线:",
    (() => {
      const emitter = new EventEmitter()
      const logs = []

      // 模拟日志系统
      emitter.on("log", (level, message) => {
        logs.push(`${level}: ${message}`)
      })

      // 模拟用户操作
      emitter.on("user:login", (user) => {
        emitter.emit("log", "info", `User ${user} logged in`)
      })

      emitter.on("user:logout", (user) => {
        emitter.emit("log", "info", `User ${user} logged out`)
      })

      emitter.emit("user:login", "alice")
      emitter.emit("user:logout", "alice")

      return (
        logs.length === 2 &&
        logs[0] === "info: User alice logged in" &&
        logs[1] === "info: User alice logged out"
      )
    })()
  )

  console.log(
    "11. 内存泄漏防护:",
    (() => {
      const emitter = new EventEmitter()
      let count = 0

      const callback = () => count++

      emitter.on("memory", callback)
      emitter.off("memory", callback)
      emitter.emit("memory")

      return count === 0
    })()
  )

  console.log(
    "12. 异步事件处理:",
    (() => {
      const emitter = new EventEmitter()
      let result = ""

      emitter.on("async", (msg) => {
        setTimeout(() => {
          result = msg
        }, 10)
      })

      emitter.emit("async", "async test")

      // 立即检查，异步事件不应该立即执行
      return result === ""
    })()
  )

  console.log(
    "13. this上下文测试:",
    (() => {
      const obj = {
        prefix: "event_",
        createEmitter: function() {
          const emitter = new EventEmitter()
          emitter.on("test", (msg) => {
            return this.prefix + msg
          })
          return typeof emitter.emit === "function"
        }
      }
      return obj.createEmitter()
    })()
  )

  console.log(
    "14. 方法调用this绑定:",
    (() => {
      const obj = {
        multiplier: 2,
        createEvent: function() {
          const emitter = new EventEmitter()
          let result = 0
          emitter.on("multiply", (value) => {
            result = value * this.multiplier
          })
          emitter.emit("multiply", 5)
          return result === 10
        }
      }
      return obj.createEvent()
    })()
  )

  console.log(
    "15. 复杂对象this绑定:",
    (() => {
      const obj = {
        config: { eventName: "custom" },
        createConfigEmitter: function() {
          const emitter = new EventEmitter()
          let result = ""
          emitter.on(this.config.eventName, (msg) => {
            result = msg
          })
          emitter.emit(this.config.eventName, "test")
          return result === "test"
        }
      }
      return obj.createConfigEmitter()
    })()
  )
}

testPubSubPattern()
